#ifndef MINIBANK_BANKSYSTEM_HH
#define MINIBANK_BANKSYSTEM_HH

#include <string>
#include <map>
#include "Customer.hh"
#include "AccountUtils.hh"

namespace minibank {

class BankSystem {
public:
    BankSystem();                             // Default constructor
    BankSystem(const BankSystem& other);      // Copy constructor
    BankSystem& operator=(const BankSystem& other);  // Copy assignment operator
    ~BankSystem();                            // Destructor

    // Register new customer
    void registerCustomer(const std::string& name);

    // Customer lookup functions
    const Customer* getCustomer(const std::string& name) const;
    std::map<std::string, Customer>& getAllCustomers(); // Used for output

    void accessAccount(const std::string& customerName, AccountType type);

    // Account operation functions
    void depositToAccount(BankAccount& account, const std::string& customerName);
    void withdrawFromAccount(BankAccount& account, const std::string& customerName);
    void transferFromAccount(BankAccount& fromAccount, const std::string& customerName);
    void printAccountTransactions(const BankAccount& account) const;
    void generateAccountReport(const BankAccount& account, const std::string& customerName) const;

    void printCustomerTransactions(const std::string& customerName) const;
    void generateCustomerReport(const std::string& customerName) const;
    void displayAllAccounts() const;

    void generateGlobalTransactionReport() const;

    void addDebugSavings(const std::string& customerName);

private:
    std::map<std::string, Customer> customers_;  // Customer data storage
};

} // namespace minibank

#endif // MINIBANK_BANKSYSTEM_HH